<?php
include_once $_SERVER["DOCUMENT_ROOT"].'/service/entite/Entite.php';
include_once $_SERVER["DOCUMENT_ROOT"].'/service/entite/musique/MusiqueEntite.php';
include_once $_SERVER["DOCUMENT_ROOT"].'/outils/database/Database.php';
include_once $_SERVER["DOCUMENT_ROOT"].'/outils/exceptions/DAOException.php';
include_once $_SERVER["DOCUMENT_ROOT"].'/persistence/albummusique/AlbumMusiqueDAO.php';

class MusiqueDAO {
	
	private function MusiqueDAO() {
		//évite la construction
	}
		
	/*
	 * Récupère la liste de toutes les musiques
	 */
	public static function loadListeMusiqueAlbum(AlbumMusiqueEntite $albumMusiqueEntite) {
		
		$result = Database::getInstance()->executeQueryAndClose("SELECT id, id_albummusique,nomfichier,numero, titre FROM musique WHERE id_albummusique = ".$albumMusiqueEntite->id." ORDER BY numero");
		$albumMusiqueEntite->listeMusique = Array();
		foreach ($result as $row) {
			$albumMusiqueEntite->listeMusique[] = MusiqueDAO::getMusiqueFromDatabaseRow($row, $albumMusiqueEntite);
		}
		return $albumMusiqueEntite;
	}
	
	public static function getMusiqueByID($idMusique) {
		
		$result = Database::getInstance()->executeQueryAndClose("SELECT id, id_albummusique,nomfichier,numero,titre FROM musique WHERE id = $idMusique");
		$musique = null;
		foreach ($result as $row) {
			$albumMusiqueEntite = AlbumMusiqueDAO::getAlbumMusiqueByID($row['id_albummusique']);
			$musique = MusiqueDAO::getMusiqueFromDatabaseRow($row, $albumMusiqueEntite);
		}
		return $musique;
	}
	
	public static function getMusiqueByNomFichierAndIDAlbumMusique($idAlbumMusique, $nomFichier) {
		
		$result = Database::getInstance()->executeQueryAndClose("SELECT id, id_albummusique,nomfichier,numero, titre FROM musique WHERE nomfichier = '$nomFichier' AND id_albummusique = $idAlbumMusique");
		$musique = null;
		foreach ($result as $row) {
			$albumMusiqueEntite = AlbumMusiqueDAO::getAlbumMusiqueByID($row['id_albummusique']);
			$musique = MusiqueDAO::getMusiqueFromDatabaseRow($row, $albumMusiqueEntite);
		}
		return $musique;
	}
	
	public static function save(MusiqueEntite $musiqueEntite) {
		if ($musiqueEntite->albumMusique == null) {
			throw new DAOException("Tentative de persister une musique sans album : ".$musiqueEntite->nomFichier);
		}
		if($musiqueEntite->id == Entite::getUnpersistedId()) {
			$albumMusique = $musiqueEntite->albumMusique;
			$result = MusiqueDAO::insert($albumMusique->id, $musiqueEntite);
		} else {
			$result = MusiqueDAO::update($musiqueEntite);
		}
		if ($result != 1) {
			$titre = $musiqueEntite->titre;
			throw new DAOException("La sauvegarde de l'entite $titre a mis à jour $result lignes");
		}
	}
	
	public static function delete($id) { 
		
		$result = Database::getInstance()->executeUpdateQueryAndClose("DELETE FROM musique WHERE id = $id") ;
		return $result;
	}
	
	public static function deleteFromNomFichier($idAlbumMusique, $nomFichier) {
		$musiqueEntite = MusiqueDAO::getMusiqueByNomFichierAndIDAlbumMusique($idAlbumMusique, $nomFichier);
		if ($musiqueEntite == null) {
			throw new DAOException("Impossible de supprimer l'enregistrement de la musique '$nomFichier' dans l'album '$idAlbumMusique' : L'enregistrement n'a pas été trouvé");
		}
		$result = MusiqueDAO::delete($musiqueEntite->id);
		return $result;
	}
	
	private static function insert($idAlbumMusique, MusiqueEntite $musiqueEntite) {
		
		$nomFichier = mysql_escape_string($musiqueEntite->nomFichier);
		$titre = mysql_escape_string($musiqueEntite->titre);
		$numero = $musiqueEntite->numero;
		$result = Database::getInstance()->executeUpdateQueryAndClose("INSERT INTO musique (id_albummusique,nomfichier,titre,numero) values ($idAlbumMusique,'$nomFichier', '$titre','$numero')") ;
		return $result;
	}
	
	private static function update(MusiqueEntite $musiqueEntite) {
		
		$nomFichier = mysql_escape_string($musiqueEntite->nomFichier);
		$titre = mysql_escape_string($musiqueEntite->titre);
		$numero = $musiqueEntite->numero;
		$result = Database::getInstance()->executeUpdateQueryAndClose("UPDATE musique SET titre = '$titre', numero = '$numero', nomFichier = '$nomFichier' WHERE id = $musiqueEntite->id");
		return $result;
	}
	
	private static function getMusiqueFromDatabaseRow($row, AlbumMusiqueEntite $albumMusiqueEntite) {
		$musiqueEntite = new MusiqueEntite();
		$musiqueEntite->id = $row['id'];
		$musiqueEntite->nomFichier = $row['nomfichier'];
		$musiqueEntite->titre = $row['titre'];
		$musiqueEntite->numero = $row['numero'];
		$musiqueEntite->albumMusique = $albumMusiqueEntite;
		return $musiqueEntite;
	}
}
?>